class Solution {
public:
// 如果这棵树只有一个节点，那么这个节点就是最小高度树的根节点，直接返回这个节点即可。
// 如果这棵树有多个节点，那么一定存在叶子节点。叶子节点是只有一个相邻节点的节点。我们可以利用拓扑排序，从外向内剥离叶子节点，当我们到达最后一层的时候，剩下的节点就可作为最小高度树的根节点。

    vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
        vector<int> res;
        if(n == 1)
        {
            res.push_back(0);
            return res;
        }
        vector<vector<int>> path(n);
        vector<int> ans(n);
        for(const auto &edge : edges)
        {
            path[edge[0]].push_back(edge[1]);
            path[edge[1]].push_back(edge[0]);
            ans[edge[0]]++;
            ans[edge[1]]++;
        }


        queue<int> que;
        for(int i = 0;i < n;i++)
        {
            if(ans[i] == 1)
            {
                que.push(i);
            }
        }
        
        while(!que.empty())
        {
            res.clear();
            int n = que.size();
            while(n--)
            {
                int temp = que.front();
                que.pop();
                res.push_back(temp);
                for(int i = 0;i<path[temp].size();i++)
                {
                    if(--ans[path[temp][i]] == 1)
                    {
                        que.push(path[temp][i]);
                    }
                }
            }

        }
        return res;
    }
};